Asynchronous Socket Programming নেটওয়ার্ক অ্যাপ্লিকেশন এবং সার্ভার ডিজাইন করার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ পদ্ধতি। এটি Socket অপারেশনগুলোকে ব্লক না করে একাধিক সংযোগ এবং কাজ একসাথে পরিচালনা করতে সহায়তা করে, যা কর্মক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করে।
নিচে Asynchronous Socket Programming-এর প্রয়োজনীয়তা এবং এর সুবিধাসমূহ নিয়ে আলোচনা করা হলো:
উচ্চ কর্মক্ষমতা এবং স্কেলেবিলিটি:
CPU রিসোর্সের কার্যকর ব্যবহার:
একাধিক সংযোগের সমর্থন:
Responsive Design নিশ্চিত করা:
Blocking সমস্যা সমাধান:
Event-Driven Architecture এবং ইভেন্ট হ্যান্ডলিং:
select()
, poll()
, বা epoll()
-এর মাধ্যমে সার্ভার একাধিক সংযোগ পর্যবেক্ষণ করতে পারে এবং যখন একটি সংযোগে ডেটা পাওয়া যায়, তখন সঠিক কলব্যাক বা ফাংশন ডাকা হয়।উচ্চতর কর্মক্ষমতা:
কম রিসোর্স ব্যবহারের মাধ্যমে কার্যকারিতা:
Responsive এবং ইন্টারেক্টিভ ডিজাইন:
নেটওয়ার্ক ইফিশিয়েন্সি বৃদ্ধি:
select()
, poll()
, এবং epoll()
এর মতো সিস্টেম কল ব্যবহার করা হয়। এগুলোর মাধ্যমে সার্ভার একাধিক সংযোগের ওপর নজর রাখতে পারে এবং যখন কোনো সংযোগ থেকে ডেটা পাওয়া যায়, তখন সেটির জন্য প্রয়োজনীয় অপারেশন করে।#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#define PORT 8080
#define MAX_EVENTS 10
int main() {
int server_fd, client_fd, epoll_fd;
struct sockaddr_in server_addr;
struct epoll_event ev, events[MAX_EVENTS];
char buffer[1024];
// Server socket তৈরি করা
server_fd = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_fd, 3);
// epoll instance তৈরি করা
epoll_fd = epoll_create(1);
ev.events = EPOLLIN;
ev.data.fd = server_fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &ev);
printf("Server is running using epoll() for Asynchronous I/O.\n");
while (1) {
int num_events = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
for (int i = 0; i < num_events; i++) {
if (events[i].data.fd == server_fd) {
client_fd = accept(server_fd, NULL, NULL);
printf("New client connected\n");
ev.events = EPOLLIN;
ev.data.fd = client_fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &ev);
} else {
int client_fd = events[i].data.fd;
int n = read(client_fd, buffer, sizeof(buffer) - 1);
if (n > 0) {
buffer[n] = '\0';
printf("Client: %s\n", buffer);
write(client_fd, buffer, n);
} else {
close(client_fd);
epoll_ctl(epoll_fd, EPOLL_CTL_DEL, client_fd, NULL);
}
}
}
}
close(server_fd);
close(epoll_fd);
return 0;
}
common.read_more